﻿using UnityEngine;
using System.Collections;
using System.Collections.Generic;

namespace TowerDefence
{
    public class Tower : MonoBehaviour
    {
        AudioManager audioManager;  // 声音管理器
        SphereCollider sphereCol;   // 球体碰撞体

        // 敌人信息
        public Transform target;     // 目标
        TowerLaser laser;            // 激光塔

        // 在塔范围内的敌人
        private List<GameObject> _enemies = new List<GameObject>();  // 游戏对象列表
        private List<Enemy> _enemy = new List<Enemy>();             // 敌人列表

        [Header("Required Fields")]    // 必填字段
        public TowerData tD;           // 塔数据
        public Transform firePoint;    // 发射点
        public Transform rotatingObj;  // 旋转对象
        public GameObject bullet;       // 子弹
        public GameObject towerRange;   // 塔范围指示器

        [Header("Tower Attack Type")]  // 塔攻击类型
        public bool Catcher;            // 捕捉型
        public bool Laser;              // 激光型
        public bool poisonTower;        // 毒塔
        public bool canAtkFlying;       // 是否可以攻击飞行敌人

        [Header("Audio")]              // 声音
        public AudioSource shotSound;   // 射击音效

        float lastfired;                // 上次射击的时间

        [Header("是否应用代码内的放大比例")]
        public bool IsTowerScale = true;
        public Vector3 TowerScale = new Vector3(1.5f, 1.5f, 1.5f);//放大比例
        // 用于捕捉型塔
        void Start()
        {
            if(IsTowerScale)
            transform.localScale = TowerScale;
            audioManager = AudioManager.instance;  // 获取音频管理器实例
            shotSound = GetComponent<AudioSource>();  // 获取声音组件
            sphereCol = GetComponent<SphereCollider>();  // 获取球体碰撞体组件
            sphereCol.radius = tD.range;  // 设置碰撞体半径为塔的射程
            HideRangeUI();  // 隐藏范围指示器

            target = null;  // 初始化目标为null

            if (Laser)
            {
                laser = bullet.GetComponent<TowerLaser>();  // 获取激光塔组件
                bullet.SetActive(false);  // 初始时禁用子弹对象
            }
            else { bullet.SetActive(true); }  // 如果不是激光塔，则启用子弹对象
        }

        #region 在塔范围内的敌人相关函数

        private void OnTriggerEnter(Collider other)
        {
            if (canAtkFlying)  // 如果可以攻击飞行敌人
            {
                // 检查碰撞对象的标签是否为敌人或飞行敌人
                if (other.tag.Equals(StringData.enemyTag) || other.tag.Equals(StringData.flyingEnemyTag))
                {
                    Enemy e = other.gameObject.GetComponent<Enemy>();  // 获取敌人组件

                    // 如果敌人尚未死亡且未中毒
                    if (e.isDead == false && e.isPoisoned == false)
                    {
                        _enemies.Add(other.gameObject);  // 将敌人游戏对象添加到列表
                        _enemy.Add(e);  // 将敌人组件添加到列表
                    }
                }
            }
            else
            {
                // 如果不能攻击飞行敌人，检查碰撞对象的标签是否为普通敌人
                if (other.tag.Equals(StringData.enemyTag))
                {
                    Enemy e = other.gameObject.GetComponent<Enemy>();  // 获取敌人组件

                    // 如果敌人尚未死亡且未中毒
                    if (e.isDead == false && e.isPoisoned == false)
                    {
                        _enemies.Add(other.gameObject);  // 将敌人游戏对象添加到列表
                        _enemy.Add(e);  // 将敌人组件添加到列表
                    }
                }
            }
        }

        private void OnTriggerExit(Collider other)
        {
            if (canAtkFlying)  // 如果可以攻击飞行敌人
            {
                // 检查碰撞对象的标签是否为敌人或飞行敌人
                if (other.tag.Equals(StringData.enemyTag) || other.tag.Equals(StringData.flyingEnemyTag))
                {
                    RemoveEnemiesFromList(other);  // 从列表中移除敌人
                }
            }
            else
            {
                // 如果不能攻击飞行敌人，检查碰撞对象的标签是否为普通敌人
                if (other.tag.Equals(StringData.enemyTag))
                {
                    RemoveEnemiesFromList(other);  // 从列表中移除敌人
                }
            }
        }

        private void RemoveEnemiesFromList(Collider other)
        {
            for (int i = 0; i < _enemies.Count; i++)
            {
                if (other.gameObject.Equals(_enemies[i]))
                {
                    _enemies.RemoveAt(i);  // 从列表中移除敌人游戏对象
                    _enemy.RemoveAt(i);    // 从列表中移除敌人组件
                }
            }
        }

        #endregion


        void Update()
        {
            if (_enemies.Count > 0)
            {
                // 设置目标为第一个敌人的位置
                target = _enemies[0].transform;
                RemoveDeadOrPoisonedEnemies(); // 移除死亡或中毒的敌人
            }
            else { target = null; }

            if (target != null)
                RotateTowerTowardsTarget(); // 旋转炮塔朝向目标

            TowerShooting(); // 炮塔射击逻辑

            shotSound.volume = audioManager.soundBar.value; // 设置射击音效音量
        }

        private void TowerShooting()
        {
            // 如果存在目标，且不是吸收器或激光模式
            if (target != null && Catcher == false && Laser == false)
            {
                FireTowerBullet(); // 发射炮塔子弹
            }

            // 如果存在目标，且不是吸收器且是激光模式
            if (target != null && Catcher == false && Laser)
            {
                FireTowerLaser(); // 发射炮塔激光
            }
            // 如果不存在目标，且不是吸收器且是激光模式
            else if (target == null && Catcher == false && Laser)
            {
                StopTowerLaser(); // 停止炮塔激光
            }
        }

        private void StopTowerLaser()
        {
            bullet.SetActive(false); // 关闭激光对象
            shotSound.Stop(); // 停止射击音效
        }

        private void FireTowerLaser()
        {
            bullet.SetActive(true); // 激活激光对象
            shotSound.Play(); // 播放射击音效

            if (laser != null)
            {
                laser.target = target;
                laser.tower = this;
            }
        }

        private void FireTowerBullet()
        {
            // 控制射击频率
            if (Time.time - lastfired > 1 / tD.fireRate)
            {
                lastfired = Time.time;

                // 实例化炮塔子弹对象
                GameObject b = Instantiate(bullet, firePoint.position, bullet.transform.rotation) as GameObject;
                TowerBullet _twrBullet = b.GetComponent<TowerBullet>();
                _twrBullet.isHit = false;
                shotSound.Play(); // 播放射击音效

                if (_twrBullet != null)
                {
                    _twrBullet.target = target;
                    _twrBullet.tower = this;
                }
            }
        }


        private void RotateTowerTowardsTarget()
        {
            // 计算目标方向
            Vector3 dir = target.transform.position - rotatingObj.transform.position;
            dir.y = 0;

            // 计算朝向目标的旋转
            Quaternion rot = Quaternion.LookRotation(dir);

            // 平滑插值旋转炮塔方向
            rotatingObj.transform.rotation = Quaternion.Slerp(rotatingObj.transform.rotation, rot, 10f * Time.deltaTime);
        }

        private void RemoveDeadOrPoisonedEnemies()
        {
            for (int i = 0; i < _enemies.Count; i++)
            {
                // 如果敌人已死亡或中毒，移除
                if (_enemy[i].isDead || _enemy[i].isPoisoned)
                {
                    _enemies.RemoveAt(i);
                    _enemy.RemoveAt(i);
                }
            }
        }

        public void ShowRangeUI()
        {
            // 显示炮塔射程UI，并设置尺寸
            towerRange.SetActive(true);
            towerRange.transform.localScale = Vector3.one * tD.range * 2;
        }

        public void HideRangeUI()
        {
            // 隐藏炮塔射程UI
            towerRange.SetActive(false);
        }

        void OnDrawGizmos()
        {
            // 在场景中绘制炮塔射程范围
            Gizmos.color = Color.red;
            Gizmos.DrawWireSphere(gameObject.transform.position, tD.range);
        }

    }
}
